/**
*********************************************************************************
*FileName:      va_arg.c
*Author:        Sjl
*Version:       1.0.0
*CreateDate:    2021.09.16
*Description:   vaired argurments 学习，可变参数函数
*Others:        Use Notes:
                1. 声明va_list对象
                2. 使用va_start 初始化 va_list对象 使其指向 第一个参数地址
                3. 使用va_arg取出参数
                4. 使用va_end 清理va_list
                va_list ap
                va_start(ap,para1)  ：传入ap和第一个参数
                va_arg(ap,type)     ：传入ap和数据类型
                va_end(ap)          ：传入ap
                参考：
                https://www.cnblogs.com/qiwu1314/p/9844039.html
                http://blog.chinaunix.net/uid-20937170-id-5749018.html
*History:
**********************************************************************************
*/

#include "stdio.h"
#include "stdarg.h"
/*
    打印不定个数整数，n：整数个数
*/
int print_int(int n, ...)
{
    va_list ap;
    va_start(ap, n);
    for (int i = 0; i < n; i++) { printf("arg %d = %d\n", i, va_arg(ap, int)); }
    va_end(ap);
    return n;
}

/*
    打印字符串和其他的内容
*/
void print_str(char *str, ...)
{
    va_list ap;
    va_start(ap, str);
    printf("%s\n", str);
    //... TODO: 在这里可以做，数据格式的解析，也就是printf的实现
    va_end(ap);
    return;
}
int main(int argc, const char *argv[])
{
    printf("hello, world\n");
    print_str("hello, world", 1, 2, 3, 4);
    print_int(5, 1, 2, 3, 4, 5);
    return 0;
}